Named Query (নেমড কুয়েরি) হল Hibernate বা JPA-তে পূর্বনির্ধারিত SQL বা HQL স্টেটমেন্ট যা একটি নির্দিষ্ট নাম দিয়ে সংজ্ঞায়িত করা হয়। এটি ডাটাবেস অপারেশনকে আরও কার্যকরী এবং পুনঃব্যবহারযোগ্য করতে ব্যবহৃত হয়। Named Query সরাসরি Entity ক্লাসে বা Mapping ফাইলে সংজ্ঞায়িত করা যেতে পারে এবং প্রয়োজনে ডাটাবেস অপারেশনের জন্য ডাকা যায়।
Hibernate বা JPA-তে Named Query সাধারণত এভাবে সংজ্ঞায়িত হয়:
@NamedQuery(
name = "Employee.findByDepartment",
query = "FROM Employee WHERE department = :department"
)
<hibernate-mapping>
<class name="com.example.model.Employee" table="employees">
<query name="Employee.findByDepartment">
<![CDATA[FROM Employee WHERE department = :department]]>
</query>
</class>
</hibernate-mapping>
Named Query একবার সংজ্ঞায়িত হলে অ্যাপ্লিকেশনের যেকোনো জায়গা থেকে পুনরায় ব্যবহার করা যায়। এটি কোড পুনর্লিখনের প্রয়োজনীয়তা দূর করে।
ডাটাবেসের জন্য প্রয়োজনীয় কুয়েরিগুলো Entity বা Mapping ফাইলেই সংজ্ঞায়িত থাকে। এর ফলে কোড এবং কুয়েরি বিচ্ছিন্ন থাকে, যা কোডের রক্ষণাবেক্ষণ সহজ করে।
Named Query সাধারণত ডাটাবেস লেভেলে কম্পাইল করা হয় এবং পরে ক্যাশে রাখা হয়। ফলে একই কুয়েরি বারবার চললেও সেটি দ্রুত কার্যকর হয়।
Named Query-এর সিনট্যাক্স শুরুতেই চেক করা হয়, যা runtime এ কুয়েরি-সম্পর্কিত ত্রুটি কমায়।
Named Query ব্যবহারে সরাসরি SQL Injection প্রতিরোধ করা যায়, কারণ এটি ব্যবহারকারীর সরাসরি ইনপুট থেকে Query তৈরি করে না।
package com.example.model;
import jakarta.persistence.*;
@Entity
@NamedQueries({
@NamedQuery(
name = "Employee.findByDepartment",
query = "FROM Employee WHERE department = :department"
),
@NamedQuery(
name = "Employee.findBySalaryGreaterThan",
query = "FROM Employee WHERE salary > :salary"
)
})
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "department")
private String department;
@Column(name = "salary")
private Double salary;
// Getters and Setters
}
DAO বা সার্ভিস লেয়ারে Named Query ব্যবহার করা হয়:
package com.example.dao;
import com.example.model.Employee;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class EmployeeDao {
@Autowired
private SessionFactory sessionFactory;
public List<Employee> findByDepartment(String department) {
Session session = sessionFactory.getCurrentSession();
return session.createNamedQuery("Employee.findByDepartment", Employee.class)
.setParameter("department", department)
.getResultList();
}
public List<Employee> findBySalaryGreaterThan(Double salary) {
Session session = sessionFactory.getCurrentSession();
return session.createNamedQuery("Employee.findBySalaryGreaterThan", Employee.class)
.setParameter("salary", salary)
.getResultList();
}
}
Named Query ব্যবহার করে ডাটাবেস অপারেশন করা:
package com.example;
import com.example.service.EmployeeService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
EmployeeService employeeService = context.getBean(EmployeeService.class);
// Named Query ব্যবহার
System.out.println("Employees in IT Department:");
employeeService.findByDepartment("IT").forEach(emp ->
System.out.println(emp.getName())
);
System.out.println("Employees with Salary > 50000:");
employeeService.findBySalaryGreaterThan(50000.0).forEach(emp ->
System.out.println(emp.getName())
);
context.close();
}
}
Named Query ডাটাবেস অপারেশনের নির্ভরযোগ্যতা বৃদ্ধি এবং কোড মডুলার করতে অত্যন্ত কার্যকর।